home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / util / cnet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-29  |  5.7 KB  |  219 lines

  1. static char rcsid[] = "@(#) $Header: cnet.c,v 1.10 91/10/10 17:27:23 deyke Exp $";
  2.  
  3. #define _HPUX_SOURCE
  4.  
  5. #include <sys/types.h>
  6.  
  7. #include <curses.h>
  8. #include <fcntl.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <sys/socket.h>
  13. #include <term.h>
  14. #include <termio.h>
  15. #include <time.h>
  16. #include <unistd.h>
  17.  
  18. #if defined(__STDC__)
  19. #define __ARGS(x)       x
  20. #else
  21. #define __ARGS(x)       ()
  22. #endif
  23.  
  24. #include "buildsaddr.h"
  25.  
  26. #define TERM_INP_FDES   0
  27. #define TERM_INP_MASK   1
  28. #define TERM_OUT_FDES   1
  29. #define TERM_OUT_MASK   2
  30.  
  31. #define SOCK_INP_FDES   3
  32. #define SOCK_INP_MASK   8
  33. #define SOCK_OUT_FDES   3
  34. #define SOCK_OUT_MASK   8
  35.  
  36. struct mbuf {
  37.   struct mbuf *next;
  38.   unsigned int  cnt;
  39.   char  *data;
  40. };
  41.  
  42. static int ansiterminal = 1;
  43. static struct mbuf *sock_queue;
  44. static struct mbuf *term_queue;
  45. static struct termio prev_termio;
  46.  
  47. static void open_terminal __ARGS((void));
  48. static void close_terminal __ARGS((void));
  49. static void terminate __ARGS((void));
  50. static void recvq __ARGS((int fd, struct mbuf **qp));
  51. static void sendq __ARGS((int fd, struct mbuf **qp));
  52. int main __ARGS((int argc, char **argv));
  53.  
  54. /*---------------------------------------------------------------------------*/
  55.  
  56. static void open_terminal()
  57. {
  58.   if (ansiterminal) {
  59.     fputs("\033=", stdout);                     /* keypad application mode */
  60.   } else {
  61.     fputs("\033Z", stdout);                     /* display fncts off       */
  62.     fputs("\033&k1I", stdout);                  /* enable ascii 8 bits     */
  63.     fputs("\033&s1A", stdout);                  /* enable xmitfnctn        */
  64.     fputs("\033&jB", stdout);                   /* enable user keys        */
  65.     fputs("\033&j@", stdout);                   /* remove key labels       */
  66.     fputs("\033&jS", stdout);                   /* lock keys               */
  67.     fputs("\033&f0a1k0d2L\033p", stdout);       /* key1 = ESC p            */
  68.     fputs("\033&f0a2k0d2L\033q", stdout);       /* key2 = ESC q            */
  69.     fputs("\033&f0a3k0d2L\033r", stdout);       /* key3 = ESC r            */
  70.     fputs("\033&f0a4k0d2L\033s", stdout);       /* key4 = ESC s            */
  71.     fputs("\033&f0a5k0d2L\033t", stdout);       /* key5 = ESC t            */
  72.     fputs("\033&f0a6k0d2L\033u", stdout);       /* key6 = ESC u            */
  73.     fputs("\033&f0a7k0d2L\033v", stdout);       /* key7 = ESC v            */
  74.     fputs("\033&f0a8k0d2L\033w", stdout);       /* key8 = ESC w            */
  75.   }
  76.   fflush(stdout);
  77. }
  78.  
  79. /*---------------------------------------------------------------------------*/
  80.  
  81. static void close_terminal()
  82. {
  83.   if (ansiterminal) {
  84.     fputs("\033>", stdout);                     /* keypad numeric mode */
  85.   } else {
  86.     fputs("\033&s0A", stdout);                  /* disable xmitfnctn */
  87.     fputs("\033&jR", stdout);                   /* release keys */
  88.   }
  89.   fflush(stdout);
  90. }
  91.  
  92. /*---------------------------------------------------------------------------*/
  93.  
  94. static void terminate()
  95. {
  96.   long  arg;
  97.  
  98.   close(SOCK_OUT_FDES);
  99.   arg = 0;
  100.   ioctl(TERM_OUT_FDES, FIOSNBIO, &arg);
  101.   for (; term_queue; term_queue = term_queue->next)
  102.     write(TERM_OUT_FDES, term_queue->data, term_queue->cnt);
  103.   close_terminal();
  104.   ioctl(TERM_INP_FDES, TCSETA, &prev_termio);
  105.   exit(0);
  106. }
  107.  
  108. /*---------------------------------------------------------------------------*/
  109.  
  110. static void recvq(fd, qp)
  111. int  fd;
  112. struct mbuf **qp;
  113. {
  114.  
  115.   char  buf[1024];
  116.   int  n;
  117.   struct mbuf *bp, *tp;
  118.  
  119.   n = read(fd, buf, sizeof(buf));
  120.   if (n <= 0) terminate();
  121.   bp = malloc(sizeof(struct mbuf ) + n);
  122.   if (!bp) terminate();
  123.   bp->next = 0;
  124.   bp->cnt = n;
  125.   bp->data = (char *) (bp + 1);
  126.   memcpy(bp->data, buf, n);
  127.   if (*qp) {
  128.     for (tp = *qp; tp->next; tp = tp->next) ;
  129.     tp->next = bp;
  130.   } else
  131.     *qp = bp;
  132. }
  133.  
  134. /*---------------------------------------------------------------------------*/
  135.  
  136. static void sendq(fd, qp)
  137. int  fd;
  138. struct mbuf **qp;
  139. {
  140.  
  141.   int  n;
  142.   struct mbuf *bp;
  143.  
  144.   bp = *qp;
  145.   n = write(fd, bp->data, bp->cnt);
  146.   if (n <= 0) terminate();
  147.   bp->data += n;
  148.   bp->cnt -= n;
  149.   if (!bp->cnt) {
  150.     *qp = bp->next;
  151.     free(bp);
  152.   }
  153. }
  154.  
  155. /*---------------------------------------------------------------------------*/
  156.  
  157. int  main(argc, argv)
  158. int  argc;
  159. char  **argv;
  160. {
  161.  
  162.   char  *server;
  163.   int  addrlen;
  164.   int  flags;
  165.   int  rmask;
  166.   int  wmask;
  167.   long  arg;
  168.   struct sockaddr *addr;
  169.   struct termio curr_termio;
  170.  
  171.   server = (argc < 2) ? "unix:/tcp/.sockets/netkbd" : argv[1];
  172.   if (!(addr = build_sockaddr(server, &addrlen))) {
  173.     fprintf(stderr, "%s: Cannot build address from \"%s\"\n", *argv, server);
  174.     exit(1);
  175.   }
  176.   close(SOCK_OUT_FDES);
  177.   if (socket(addr->sa_family, SOCK_STREAM, 0) != SOCK_OUT_FDES) {
  178.     perror(*argv);
  179.     exit(1);
  180.   }
  181.   if (connect(SOCK_OUT_FDES, addr, addrlen)) {
  182.     perror(*argv);
  183.     exit(1);
  184.   }
  185.   if ((flags = fcntl(SOCK_OUT_FDES, F_GETFL, 0)) == -1 ||
  186.       fcntl(SOCK_OUT_FDES, F_SETFL, flags | O_NDELAY) == -1) {
  187.     perror(*argv);
  188.     exit(1);
  189.   }
  190.  
  191.   setupterm(0, 1, 0);
  192.   if (!strcmp(cursor_up, "\033A")) ansiterminal = 0;
  193.   resetterm();
  194.  
  195.   open_terminal();
  196.   arg = 1;
  197.   ioctl(TERM_OUT_FDES, FIOSNBIO, &arg);
  198.   ioctl(TERM_INP_FDES, TCGETA, &prev_termio);
  199.   ioctl(TERM_INP_FDES, TCGETA, &curr_termio);
  200.   curr_termio.c_lflag = 0;
  201.   curr_termio.c_cc[VMIN] = 1;
  202.   curr_termio.c_cc[VTIME] = 0;
  203.   ioctl(TERM_INP_FDES, TCSETA, &curr_termio);
  204.  
  205.   for (; ; ) {
  206.     rmask = SOCK_INP_MASK | TERM_INP_MASK;
  207.     wmask = 0;
  208.     if (sock_queue) wmask |= SOCK_OUT_MASK;
  209.     if (term_queue) wmask |= TERM_OUT_MASK;
  210.     if (select(4, &rmask, &wmask, (int *) 0, (struct timeval *) 0) < 1)
  211.       continue;
  212.     if (rmask & SOCK_INP_MASK) recvq(SOCK_INP_FDES, &term_queue);
  213.     if (rmask & TERM_INP_MASK) recvq(TERM_INP_FDES, &sock_queue);
  214.     if (wmask & SOCK_OUT_MASK) sendq(SOCK_OUT_FDES, &sock_queue);
  215.     if (wmask & TERM_OUT_MASK) sendq(TERM_OUT_FDES, &term_queue);
  216.   }
  217. }
  218.  
  219.